package org.ix.dynamicapis.presentation.condition;

import org.ix.dynamicapis.model.SelectCondition;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Collection;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 接口配置查询条件
 *
 * @author 郗世豪（rarexixi@gmail.com）
 */
@Getter
@Setter
@ToString
public class ApiSelectCondition extends SelectCondition {

    /**
     * 接口ID
     */
    private Integer id;

    /**
     * 接口ID列表
     */
    private Collection<Integer> idIn;

    /**
     * 排除的接口ID列表
     */
    private Collection<Integer> idNotIn;

    /**
     * 最小接口ID
     */
    private Integer idMin;

    /**
     * 最大接口ID
     */
    private Integer idMax;

    /**
     * 所属业务系统
     */
    private String systemCode;

    /**
     * 所属业务系统列表
     */
    private Collection<String> systemCodeIn;

    /**
     * 排除的所属业务系统列表
     */
    private Collection<String> systemCodeNotIn;

    /**
     * 所属业务系统不为空
     */
    private Boolean systemCodeIsNotEmpty;

    /**
     * 所属业务系统为空
     */
    private Boolean systemCodeIsEmpty;

    /**
     * 所属业务系统开始
     */
    private String systemCodeStartWith;

    /**
     * 所属业务系统结束
     */
    private String systemCodeEndWith;

    /**
     * 所属业务系统包含
     */
    private String systemCodeContains;

    /**
     * 数据来源
     */
    private String datasource;

    /**
     * 数据来源列表
     */
    private Collection<String> datasourceIn;

    /**
     * 排除的数据来源列表
     */
    private Collection<String> datasourceNotIn;

    /**
     * 数据来源不为空
     */
    private Boolean datasourceIsNotEmpty;

    /**
     * 数据来源为空
     */
    private Boolean datasourceIsEmpty;

    /**
     * 数据来源开始
     */
    private String datasourceStartWith;

    /**
     * 数据来源结束
     */
    private String datasourceEndWith;

    /**
     * 数据来源包含
     */
    private String datasourceContains;

    /**
     * 接口说明
     */
    private String name;

    /**
     * 接口说明列表
     */
    private Collection<String> nameIn;

    /**
     * 排除的接口说明列表
     */
    private Collection<String> nameNotIn;

    /**
     * 接口说明不为空
     */
    private Boolean nameIsNotEmpty;

    /**
     * 接口说明为空
     */
    private Boolean nameIsEmpty;

    /**
     * 接口说明开始
     */
    private String nameStartWith;

    /**
     * 接口说明结束
     */
    private String nameEndWith;

    /**
     * 接口说明包含
     */
    private String nameContains;

    /**
     * 版本 (格式：v主版本号-次版本号)
     */
    private String version;

    /**
     * 版本列表
     */
    private Collection<String> versionIn;

    /**
     * 排除的版本列表
     */
    private Collection<String> versionNotIn;

    /**
     * 版本不为空
     */
    private Boolean versionIsNotEmpty;

    /**
     * 版本为空
     */
    private Boolean versionIsEmpty;

    /**
     * 版本开始
     */
    private String versionStartWith;

    /**
     * 版本结束
     */
    private String versionEndWith;

    /**
     * 版本包含
     */
    private String versionContains;

    /**
     * 主题
     */
    private String topic;

    /**
     * 主题列表
     */
    private Collection<String> topicIn;

    /**
     * 排除的主题列表
     */
    private Collection<String> topicNotIn;

    /**
     * 主题不为空
     */
    private Boolean topicIsNotEmpty;

    /**
     * 主题为空
     */
    private Boolean topicIsEmpty;

    /**
     * 主题开始
     */
    private String topicStartWith;

    /**
     * 主题结束
     */
    private String topicEndWith;

    /**
     * 主题包含
     */
    private String topicContains;

    /**
     * 接口路径
     */
    private String apiPath;

    /**
     * 接口路径列表
     */
    private Collection<String> apiPathIn;

    /**
     * 排除的接口路径列表
     */
    private Collection<String> apiPathNotIn;

    /**
     * 接口路径不为空
     */
    private Boolean apiPathIsNotEmpty;

    /**
     * 接口路径为空
     */
    private Boolean apiPathIsEmpty;

    /**
     * 接口路径开始
     */
    private String apiPathStartWith;

    /**
     * 接口路径结束
     */
    private String apiPathEndWith;

    /**
     * 接口路径包含
     */
    private String apiPathContains;

    /**
     * sql返回结果 (1:List, 2:Object)
     */
    private Integer resultType;

    /**
     * sql返回结果列表
     */
    private Collection<Integer> resultTypeIn;

    /**
     * 排除的sql返回结果列表
     */
    private Collection<Integer> resultTypeNotIn;

    /**
     * 最小sql返回结果
     */
    private Integer resultTypeMin;

    /**
     * 最大sql返回结果
     */
    private Integer resultTypeMax;

    /**
     * 是否有参数(0否, 1是)
     */
    private Integer hasParams;

    /**
     * 是否有参数列表
     */
    private Collection<Integer> hasParamsIn;

    /**
     * 排除的是否有参数列表
     */
    private Collection<Integer> hasParamsNotIn;

    /**
     * 最小是否有参数
     */
    private Integer hasParamsMin;

    /**
     * 最大是否有参数
     */
    private Integer hasParamsMax;

    /**
     * 是否临时接口 (0否，1是)
     */
    private Integer temporary;

    /**
     * 是否临时接口列表
     */
    private Collection<Integer> temporaryIn;

    /**
     * 排除的是否临时接口列表
     */
    private Collection<Integer> temporaryNotIn;

    /**
     * 最小是否临时接口
     */
    private Integer temporaryMin;

    /**
     * 最大是否临时接口
     */
    private Integer temporaryMax;

    /**
     * 最小过期时间
     */
    private LocalDateTime expiresMin;

    /**
     * 最大过期时间
     */
    private LocalDateTime expiresMax;

    /**
     * 过期时间不为null
     */
    private Boolean expiresIsNotNull;

    /**
     * 过期时间为null
     */
    private Boolean expiresIsNull;

    /**
     * 是否可以缓存(0否, 1是)
     */
    private Integer cacheable;

    /**
     * 是否可以缓存列表
     */
    private Collection<Integer> cacheableIn;

    /**
     * 排除的是否可以缓存列表
     */
    private Collection<Integer> cacheableNotIn;

    /**
     * 最小是否可以缓存
     */
    private Integer cacheableMin;

    /**
     * 最大是否可以缓存
     */
    private Integer cacheableMax;

    /**
     * 缓存时长 (单位:分钟，默认一天)
     */
    private Integer cacheTime;

    /**
     * 缓存时长列表
     */
    private Collection<Integer> cacheTimeIn;

    /**
     * 排除的缓存时长列表
     */
    private Collection<Integer> cacheTimeNotIn;

    /**
     * 最小缓存时长
     */
    private Integer cacheTimeMin;

    /**
     * 最大缓存时长
     */
    private Integer cacheTimeMax;

    /**
     * 扩展信息
     */
    private String extInfo;

    /**
     * 扩展信息列表
     */
    private Collection<String> extInfoIn;

    /**
     * 排除的扩展信息列表
     */
    private Collection<String> extInfoNotIn;

    /**
     * 扩展信息不为空
     */
    private Boolean extInfoIsNotEmpty;

    /**
     * 扩展信息为空
     */
    private Boolean extInfoIsEmpty;

    /**
     * 扩展信息开始
     */
    private String extInfoStartWith;

    /**
     * 扩展信息结束
     */
    private String extInfoEndWith;

    /**
     * 扩展信息包含
     */
    private String extInfoContains;

    /**
     * 是否删除(0否, 1是)
     */
    private Integer deleted;

    /**
     * 创建人
     */
    private String createUser;

    /**
     * 创建人列表
     */
    private Collection<String> createUserIn;

    /**
     * 排除的创建人列表
     */
    private Collection<String> createUserNotIn;

    /**
     * 创建人不为空
     */
    private Boolean createUserIsNotEmpty;

    /**
     * 创建人为空
     */
    private Boolean createUserIsEmpty;

    /**
     * 创建人开始
     */
    private String createUserStartWith;

    /**
     * 创建人结束
     */
    private String createUserEndWith;

    /**
     * 创建人包含
     */
    private String createUserContains;

    /**
     * 修改人
     */
    private String updateUser;

    /**
     * 修改人列表
     */
    private Collection<String> updateUserIn;

    /**
     * 排除的修改人列表
     */
    private Collection<String> updateUserNotIn;

    /**
     * 修改人不为空
     */
    private Boolean updateUserIsNotEmpty;

    /**
     * 修改人为空
     */
    private Boolean updateUserIsEmpty;

    /**
     * 修改人开始
     */
    private String updateUserStartWith;

    /**
     * 修改人结束
     */
    private String updateUserEndWith;

    /**
     * 修改人包含
     */
    private String updateUserContains;

    /**
     * 最小创建时间
     */
    private LocalDateTime createTimeMin;

    /**
     * 最大创建时间
     */
    private LocalDateTime createTimeMax;

    /**
     * 最小更新时间
     */
    private LocalDateTime updateTimeMin;

    /**
     * 最大更新时间
     */
    private LocalDateTime updateTimeMax;
}
